import axios from 'axios';
import router from '../../src/router';
import Environment from '../../src/environments';

/**
 * 默认10S请求超时
 */
axios.defaults.timeout = 10000;

/**
 * 设置请求头
 */
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

/**
 * 请求拦截器
 */
axios.interceptors.request.use(
    config => {
        // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
        // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
        if (window.localStorage.getItem('token')) {
            const token = window.localStorage.getItem('token');
            config.headers.Authorization = `Bearer ${token}`;
        }
        if (!config.url.startsWith('https://') && !config.url.startsWith('http://')) {
            config.url = Environment.BaseUrl + config.url;
        }
        return config;
    },
    error => {
        return Promise.error(error);
    }
)
/**
 * 响应拦截器
 */
axios.interceptors.response.use((response) => {
    return response;
}, (error) => {
    error = error ? error : { response: {} };
    let { response: res } = error;
    let { data: _data } = res;

    if (_data && _data.status === 401) {
        console.log("未登录,跳转至登录页");
    }
    if (res.status === 404) {
        router.push({ path: '/404' });
    } else if (res.status === 500) {
        router.push({ path: '/500' });
    }

    return Promise.reject(res);
});

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function get(url, params) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params
        }).then(res => {
            resolve(res);
        }).catch(err => {
            reject(err)
        })
    });
}

/** 
 * post方法，对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
function post(url, params) {
    return new Promise((resolve, reject) => {
        axios.post(url, QS.stringify(params))
            .then(res => {
                resolve(res);
            })
            .catch(err => {
                reject(err)
            })
    });
}

export default{
    get,
    post
}